package com.budwk.app.sqfwV2.generator.weiqingmen;

import com.budwk.app.sqfwDoc.bo.ExcelCreateConfig;
import com.budwk.app.sqfwDoc.bo.SqfwExcelJudgeRes;
import com.budwk.app.sqfwDoc.codeGeneratorV2.fileParam.ExcelGenerateParam;
import com.budwk.app.sqfwDoc.codeGeneratorV2.fileParam.ExcelRowDataParam;
import com.budwk.app.sqfwDoc.codeGeneratorV2.generate.BaseExcelGenerator;
import com.budwk.app.sqfwDoc.codeGeneratorV2.generate.ResultOfExcelDataInto;
import com.budwk.app.sqfwV2.dto.weiqingmen.SafetyCheckDTO;
import com.budwk.app.sqfwV2.dto.weiqingmen.SafetyCheckExcelImageConfigBO;
import com.budwk.app.sqfwV2.enums.weiqingmen.SafetyCheckEnum;
import com.budwk.app.util.ClassUtil;
import com.budwk.app.util.MapUtil;
import com.budwk.app.util.poiUtils.PictureUtils;
import com.budwk.app.util.poiUtils.excelPictureConfigBO.ExcelFileCreateParamBO;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 东方祥云低代码1.1
 * @since 2024-04-01
 * <p>
 * 威清门消防安全排查 SafetyCheck
 * 今冬明春火灾防控“三清单”.xlsx
 */
public class ThreeExcelGenerator extends BaseExcelGenerator {

    /**
     * 自定义excel的表头数据
     *
     * @param excelParam         excel参数整体参数map
     * @param excelGenerateParam 创建excel所提供的参数
     */
    @Override
    protected void customerPopularHeaderData(Map<String, Object> excelParam, ExcelGenerateParam excelGenerateParam) {
        ExcelCreateConfig config = excelGenerateParam.getExcelConfig();
        // 是否为下载模板，如果为模板下载，则把标题的值设置为空
        if (config.getOnlyGenerateTemplateFlag()) {
            MapUtil.setMapValueToNull(excelParam);
        }
    }

    /**
     * 后端自定义维护表头数据
     *
     * @param excelParam         excel整体参数
     * @param excelGenerateParam 创建excel所提供的参数
     */
    @Override
    protected void customerPopularHeaderDataForAdmin(Map<String, Object> excelParam, ExcelGenerateParam excelGenerateParam) {

    }

    /**
     * 如果在遍历之前就能够判断excel是否生成，那么就在这个方法中进行判断(数据检测)
     * @param excelParam         excel整体参数
     * @param excelGenerateParam 创建excel所提供的参数
     * @return 判断excel是否含有数据
     */
    @Override
    protected ResultOfExcelDataInto judgeExcelHaveDataBeforeErgodic(Map<String, Object> excelParam, ExcelGenerateParam excelGenerateParam) {
        // 如果不是数据检测，直接返回
        if (excelGenerateParam.getExcelConfig().getCreateExcelFileFlag()) return null;

        // 数据检测
        List<ExcelRowDataParam> dataList = excelGenerateParam.getDataList();
        ResultOfExcelDataInto resultOfExcelDataInto = new ResultOfExcelDataInto();
        resultOfExcelDataInto.setExcelHaveDataFlag(false);
        for (ExcelRowDataParam excelRowDataParam : dataList) {
            // 判断是否有满足条件的数据，只有检测到一条就可以结束
            if (addRowDataCondition(excelRowDataParam, excelGenerateParam)) {
                resultOfExcelDataInto.setExcelHaveDataFlag(true);
                break;
            }
        }
        return resultOfExcelDataInto;
    }

    /**
     * 根据行数据判断是否该条数据进入excel中
     *
     * @param rowDataParam       行数据
     * @param excelGenerateParam excel生成所提供的参数
     * @return 是/否
     */
    @Override
    protected boolean addRowDataCondition(ExcelRowDataParam rowDataParam, ExcelGenerateParam excelGenerateParam) {
        SafetyCheckDTO fieldDTO = (SafetyCheckDTO) rowDataParam.getAbstractCustomerPdfCreateField();
        if ("餐饮店面/店面/临摊、夜市摊".contains(fieldDTO.getAttributesOfInspectionUnits()) &&
                !"无".equals(BaseGenerator.getHiddenDangers(fieldDTO)) &&
                        !BaseGenerator.HIDDEN_MAP.containsKey(fieldDTO.getOtherHiddenDangers().getKey())) {
            return true;
        }
        return false;
    }

    /**
     * 用户自定义填充excel实体数据
     *
     * @param mapList            数据数据
     * @param excelGenerateParam 创建excel所需的参数
     */
    @Override
    protected void customerPopularSheetData(List<Map<String, Object>> mapList, ExcelGenerateParam excelGenerateParam) {
        ExcelCreateConfig excelCreateConfig = excelGenerateParam.getExcelConfig();

        // 数据检测
        if (!excelCreateConfig.getCreateExcelFileFlag()) return;

        mapList.clear();

        List<ExcelRowDataParam> rowDataParamList = excelGenerateParam.getDataList();

        List<SafetyCheckDTO> lastList = (List<SafetyCheckDTO>) excelGenerateParam.getCustomerParamMap().get("safetyCheckList");

        int num = 0;
        for (ExcelRowDataParam rowDataParam : rowDataParamList) {
            if (!this.addRowDataCondition(rowDataParam, excelGenerateParam)) continue;

            SafetyCheckDTO fieldDTO = (SafetyCheckDTO) rowDataParam.getAbstractCustomerPdfCreateField();

            List<Map<String, Object>> maps = BaseGenerator.getHiddenDangerInfo(fieldDTO, lastList, 1);

            for (Map<String, Object> map : maps) {
                num ++;
                map.put("num", num);
                map.put(ClassUtil.getField(SafetyCheckDTO::getPlaceName), fieldDTO.getPlaceName());
                map.put(ClassUtil.getField(SafetyCheckDTO::getAddress), fieldDTO.getAddress());
                map.put(ClassUtil.getField(SafetyCheckDTO::getOperator), fieldDTO.getOperator());
                map.put(ClassUtil.getField(SafetyCheckDTO::getOperatorTelephone), fieldDTO.getOperatorTelephone());
                map.put(ClassUtil.getField(SafetyCheckExcelImageConfigBO::getCheckedUnitLeader),
                        PictureUtils.splitUrl(fieldDTO.getCheckedUnitLeader(), 1));
                map.put(ClassUtil.getField(SafetyCheckDTO::getPlaceType), fieldDTO.getPlaceType().getKey());
                map.put("beforeImg", null);
                map.put("afterImg", null);
                mapList.add(map);
            }
        }

        // 下载图片
        PictureUtils.concurrenceDownImg(mapList, this.getImageConfigBO());
    }

    @Override
    protected void customerPopularRowDataMap(Map<String, Object> rowDataMap, ExcelRowDataParam rowDataParam) {
    }

    /**
     * 自定义填充excel中每一行的数据
     *
     * @param rowDataMap   当前行的数据Map
     * @param rowDataParam 所提供的当前行的数据
     */
    @Override
    protected void customerPopularRowDataMap(Map<String, Object> rowDataMap, ExcelRowDataParam rowDataParam, ExcelGenerateParam excelGenerateParam) {
//        SafetyCheckDTO fieldDTO = (SafetyCheckDTO) rowDataParam.getAbstractCustomerPdfCreateField();
//        rowDataMap.put("hidden", BaseGenerator.getHiddenDangers(fieldDTO));
//        rowDataMap.put("measure", BaseGenerator.getMeasure(fieldDTO));
//
//        //List<SafetyCheckDTO> safetyCheckList = (List<SafetyCheckDTO>) excelGenerateParam.getCustomerParamMap().get("safetyCheckList");
//        rowDataMap.put("condition", BaseGenerator.getCondition(fieldDTO));
//
//        rowDataMap.put(ClassUtil.getField(SafetyCheckDTO::getPlaceType), fieldDTO.getPlaceType().getKey());
//
//        rowDataMap.put(ClassUtil.getField(SafetyCheckExcelImageConfigBO::getCheckedUnitLeader), PictureUtils.splitUrl(fieldDTO.getCheckedUnitLeader(), 1));
    }

    /**
     * 后端生成excel时候自定义填充excel中每一行的数据
     *
     * @param rowDataMap   当前行的数据Map
     * @param rowDataParam 所提供的当前行的数据
     */
    @Override
    protected void customerPopularRowDataMapForAdmin(Map<String, Object> rowDataMap, ExcelRowDataParam rowDataParam) {
        SafetyCheckDTO fieldDTO = (SafetyCheckDTO) rowDataParam.getAbstractCustomerPdfCreateField();
    }

    /**
     * 在创建之前判断excel中是否含有数据
     *
     * @param excelParam         创建之前excel中已经填充的数据
     * @param excelGenerateParam 所提供的excel创建的所需要的数据
     * @return 结果
     */
    @Override
    protected ResultOfExcelDataInto judgeExcelHaveDataBeforeCreate(Map<String, Object> excelParam, ExcelGenerateParam excelGenerateParam) {
//        ResultOfExcelDataInto resultOfExcelDataInto = new ResultOfExcelDataInto();
//
//        List<Map<String, Object>> listMap = (List<Map<String, Object>>) excelParam.get("list");
//
//        if (excelGenerateParam.getExcelConfig().getCreateExcelFileFlag()) return null;
//
//        // 数据检测
//        if (listMap != null && listMap.size() > 0) {
//            resultOfExcelDataInto.setExcelHaveDataFlag(true);
//        } else {
//            resultOfExcelDataInto.setExcelHaveDataFlag(false);
//        }
//        return resultOfExcelDataInto;
        return null;
    }

    @Override
    protected String getTemplatePath(ExcelGenerateParam excelGenerateParam) {
        return "sqfwV2/weiqingmen/Three.xlsx";
    }

    /**
     * 可以参照 {@link com.budwk.app.sqfw.enums.DownLoadFileNameEnum}
     *
     * @return 文件名名称
     */
    @Override
    public String getDownloadFileName(ExcelGenerateParam excelGenerateParam) {
        //TODO 在这里返回你生成的文件名名称
        // 注意注意注意不用带上后缀
        return SafetyCheckEnum.FIRE_SAFETY_INSPECTION.getCompilationName();
    }


    @Override
    protected Class<?> getImageConfigBO() {
        return SafetyCheckExcelImageConfigBO.class;
    }

    /**
     * 允许用户在创建excel文件之前对配置进行修改
     *
     * @param excelFileCreateParamBO 创建excel的配置参数
     */
    @Override
    protected void completeExcelFileCreateParam(ExcelFileCreateParamBO excelFileCreateParamBO) {

    }
}
